import Vue from 'vue'
import Vuex from 'vuex'
// 导入axios包，用于发起数据请求
import axios from 'axios'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    // 所有的任务列表事项
    list: [],
    // 文本框输入的内容
    inputValue: 'aaa',
    // 自定义添加事项的id
    nextId: 5,
    // 点击tab选项卡传过来的key值
    viewkey: 'all'
  },
  mutations: {
    initList(state, list) {
      state.list = list
    },
    // 拿到文本框输入的最新的值重新赋值给store中inputValue的值
    setInputValue(state, val) {
      state.inputValue = val
    },
    // 添加列表项的函数
    addItem(state) {
      const obj = {
        id: state.nextId,
        info: state.inputValue.trim(),
        done: false
      }
      state.list.push(obj)
      state.inputValue = ''
      state.nextId++
    },
    // 根据id删除对应的任务事项
    removeItem(state, id) {
      // 根据id查找对应的事项的索引号
      // const index = state.list.findIndex(value => value.id === id)
      const index = state.list.findIndex(value => {
        return value.id === id
      })
      // 根据找到的索引，删除对应的事项
      if (index !== -1) {
        state.list.splice(index, 1)
      }
    },
    // 修改复选框状态值函数
    modifyItem(state, param) {
      // 根据传过来的id将该项查找出来
      const i = state.list.findIndex(value => {
        return value.id === param.id
      })
      if (i !== -1) {
        state.list[i].done = param.status
      }
    },
    // 清除已完成的任务列表
    cleanDone(state) {
      // 实际就是筛选出未完成的事项直接赋值给store即可
      state.list = state.list.filter(val => val.done === false)
    },
    // 点击tab选项卡，切换列表显示
    viewKey(state, key) {
      state.viewkey = key
    }
  },
  actions: {
    // 发起数据请求
    getList(context) {
      // 通过解构赋值获取到返回的数据，并赋值给store中的list，以便共享给所有组件页面的使用
      axios.get('/list.json').then(({ data }) => {
        // console.log(data)
        context.commit('initList', data)
      })
    }
  },
  getters: {
    // 统计未完成事项的条数
    unDoneNum(state) {
      // 通过filter方法筛选出未完成的事项，该方法返回一个新数组,再调用数组的length属性拿到事项条数
      return state.list.filter(value => value.done === false).length
    },
    // 加工处理store中的数据，根据页面需要的数据进行展示
    infolist(state) {
      if (state.viewkey === 'all') {
        return state.list
      }
      if (state.viewkey === 'undone') {
        return state.list.filter(val => val.done === false)
      }
      if (state.viewkey === 'done') {
        return state.list.filter(val => val.done === true)
      }
      // 防止报错，上述条件都不符合，直接返回原数据
      return state.list
    }
  }
})
